#include "tm1638.h"
#include "delay.h"
#include "IM6103.h"
#include "relay.h"
#include "beep.h"
#include "ugui.h"
#include "ugui_key.h"
#include "ugui_lcd_app.h"

uint8_t DispTab[4];                  //
uint8_t Update_disp_flg=0;           //更新显示标志

void TM1638_Write(uint8_t DATA)     //写数据函数
{
   
   uint8_t i;

   TM1638_DIO_OUT();
   for(i=0;i<8;i++)
   {
     TM1638_CLK(0);
     delay_us(1);
     if(DATA&0X01)
     {
       TM1638_DIO_DataOUT(1);
     }
     else
     {
       TM1638_DIO_DataOUT(0);
     }
     DATA>>=1;
     TM1638_CLK(1);
     delay_us(1);
   }

}

uint8_t TM1638_Read(void) //读数据函数
{
  uint8_t i;
  uint8_t temp=0;
  TM1638_DIO_IN();
  for(i=0;i<8;i++)
  {
    temp>>=1;
    TM1638_CLK(0);
    delay_us(1);
    if(TM1638_DIO_DataIN()==1)
    {
      temp|=0x80;
    }
    TM1638_CLK(1);
    delay_us(1);
  }
  return temp;
}

void Write_COM(uint8_t cmd) //发送命令字
{
  TM1638_STB(0);
  TM1638_Write(cmd);
  TM1638_STB(1);
}

uint32_t TM1638_Read_Key(void)
{
    KEY_TypeDef Value = {0}; 
    uint8_t i;
    TM1638_STB(0);
    TM1638_Write(0x42);                     //读键扫数据 命令 
    delay_us(4);
    for(i=0;i<4;i++) 
    {
        Value.HEX_8[i] = TM1638_Read();  //4个字节数据合成一个字节 
    }
    TM1638_STB(1);
    return Value.HEX_32;
}  

void Write_DATA(uint8_t add,uint8_t DATA) //指定地址写入数据
{
     Write_COM(0x44);      //固定地址
     TM1638_STB(0);
     TM1638_Write(0xc0|add);
     TM1638_Write(DATA);
     TM1638_STB(1);
}

//数据保存到显示缓冲区
void set_display_byte(uint8_t dig,uint8_t dat)
{
    DispTab[dig]=dat;
}

//显示LED
void display_led(uint8_t dig,uint8_t dat)
{
    Write_DATA(dig,dat);
}
//闪烁
void Flicker(uint8_t n)
{
  uint8_t i;
  for(i=0;i<n;i++)
  {
    display_led(TM1638_GRID1+i*2,0x00);
  }
}

//清除数码管显示
void dispclear(uint8_t n,uint8_t m)
{
  uint8_t i;
  if(m)
  {
     for(i=0;i<n;i++)
     {
         DispTab[i]=0x00;
         display_led(TM1638_GRID1+2*i+1,DispTab[i]);
     }
  }
  else
  {
     n = 4 - n;
     for (i=4; i>n; i--)
     {
         DispTab[i-1]=0x00;
         display_led(TM1638_GRID1+2*i+1,DispTab[i]);
     }        
  }
}

void UpdateDisp(void)                   //更新四段数码管显示
{
  uint8_t i;
  for(i=0;i<4;i++)
  {
    display_led(TM1638_GRID1+i*2,DispTab[i]);
  }   
}

uint8_t Temp[15];

uint8_t DigitalTube[9]={0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

//dig数码管位，seg数码管段，onoff数码管亮灭
void Digital_led(uint8_t dig,uint8_t seg,uint8_t onoff)
{
    if(onoff)Temp[dig]|=DigitalTube[seg];
    else     Temp[dig]&=(~DigitalTube[seg]);
    Write_DATA((TM1638_GRID1|dig),Temp[dig]);
}

void DigitalTube_led(uint8_t dig,uint8_t seg,uint8_t onoff)
{
    if(onoff)Temp[dig]|=DigitalTube[seg];
    else     Temp[dig]&=(~DigitalTube[seg]);
    Write_DATA((TM1638_GRID1|dig*2),Temp[dig]);
}

void TM1638_Digital_LED_SET(uint16_t led_state)
{
    Write_DATA((TM1638_GRID1|0),led_state);
    Write_DATA((TM1638_GRID1|1),led_state>>8);
}

 //TM1638初始化函数
void TM1638_Init(void)
{
    GPIO_OutInit(NSS_PORT,NSS_PIN);
    GPIO_OutInit(SCK_PORT,SCK_PIN);
    GPIO_OutInit(MISO_PORT,MISO_PIN);
    GPIO_OutInit(MOSI_PORT,MOSI_PIN);
    
    TM1638_STB(1); TM1638_CLK(1); TM1638_DIO_DataOUT(0);

    Write_COM(0x8a);                  //亮度 (0x88-0x8f)8级亮度可调
    Write_COM(0x40);                  //采用地址自动加1
    TM1638_STB(0);          
    TM1638_Write(0xc0);               //设置起始地址
    for(uint8_t i=0;i<16;i++)        //传送16个字节的数据
    {
        TM1638_Write(0x00);
    }
    TM1638_STB(1);
    //  Write_DATA(0xc8,0x55);
    //  Write_DATA(0xc8,0xAA);  
    //  Write_DATA(0xc9,0x01);
    //  Write_DATA(0xc9,0x02);  
    //  Write_DATA(0xca,0x55);
    //  Write_DATA(0xca,0xAA);  
    //  Write_DATA(0xcb,0x01);
    //  Write_DATA(0xcb,0x02);   
}




